package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Module;
import cn.itcast.domain.system.Role;
import cn.itcast.service.system.ModuleService;
import cn.itcast.service.system.RoleService;
import cn.itcast.web.controller.BaseController;
import cn.itcast.web.util.JedisUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/system/role")
@Slf4j
public class RoleController extends BaseController {

    @Autowired
    private RoleService roleService;

    /**
     * 1. 列表
     */
    @RequestMapping("/list")
    public String list(@RequestParam(defaultValue = "1") Integer pageNum,
                       @RequestParam(defaultValue = "5") Integer pageSize) {
        log.info("执行角色列表查询开始...");

        String companyId = getLoginCompanyId();
        PageInfo<Role> pageInfo = roleService.findByPage(companyId, pageNum, pageSize);
        request.setAttribute("pageInfo", pageInfo);
        return "system/role/role-list";
    }

    /**
     * 2. 进入添加页面，要显示部门下拉列表
     */
    @RequestMapping("/toAdd")
    public String toAdd(Model model) {
        return "system/role/role-add";
    }

    /**
     * 3. 添加角色或修改角色
     */
    @RequestMapping("/edit")
    public String edit(Role role) {
        // 设置企业id、企业名称（后期再从登陆角色哪里获取）
        role.setCompanyId(getLoginCompanyId());
        role.setCompanyName(getLoginCompanyName());

        // 根据id判断是添加还是修改
        if (StringUtils.isEmpty(role.getId())) {
            // 添加
            roleService.save(role);
        } else {
            // 修改
            roleService.update(role);
        }
        return "redirect:/system/role/list";
    }

    /**
     * 4. 列表页面，点击编辑，进入role-update.jsp页面
     */
    @RequestMapping("/toUpdate")
    public String toUpdate(String id, Model model) {
        //根据角色id查询
        Role role = roleService.findById(id);
        //保存查询结果
        model.addAttribute("role", role);
        //跳转到页面
        return "system/role/role-update";
    }

    /**
     * 5. 删除
     */
    @GetMapping("/delete")
    public String delete(String id) {
        roleService.delete(id);
        return "redirect:/system/role/list";
    }

    /**
     * 6. 角色分配权限（1）从role-list.jsp页面点击权限，进入到role-module.jsp页面
     */
    @GetMapping("/roleModule")
    public String roleModule(String roleId) {
        Role role = roleService.findById(roleId);
        request.setAttribute("role", role);
        return "system/role/role-module";
    }

    @Autowired
    private ModuleService moduleService;
    /**
     * 6. 角色分配权限（2）在role-module.jsp页面，异步请求，返回ztree需要的json格式数据
     * result = [
     * { id:2, pId:0, name:"随意勾选 2", checked:true, open:true}
     * ]
     */
    @RequestMapping(value = "/getZtreeNodes",produces = {"application/json;charset=utf-8"})
    @ResponseBody()
    public String getZtreeNodes(String roleId) throws Exception {

        /*//1. 定义方法返回的对象
        List<Map<String, Object>> result = new ArrayList<>();

        //2. 查询所有权限
        List<Module> moduleList = moduleService.findAll();

        //3. 查询当前角色已经拥有的权限
        List<Module> roleModuleList = moduleService.findModuleByRoleId(roleId);

        //4. 遍历所有权限
        for (Module module : moduleList) {
            //4.1 创建map，封装权限信息（map的key是固定的: id、pId、name、checked、open）
            Map<String,Object> map = new HashMap<>();
            map.put("id",module.getId());
            map.put("pId",module.getParentId());
            map.put("name",module.getName());
            map.put("open",true);
            // 设置选中
            if (roleModuleList.contains(module)){
                map.put("checked",true);
            }
            //4.2 添加到集合
            result.add(map);
        }

        return result;*/

        //1.查询redis里面存储的类别列表数据返回json字符串数据
        //获取Jedis连接
        Jedis jedis = JedisUtils.getJedis();
        //读取数据
        String result = jedis.get("modules"+roleId);

        ObjectMapper objectMapper = new ObjectMapper();

        //2.判断json字符串是否有数据
        if(result==null) {

            List<Map<String, Object>> resultList = new ArrayList<>();
            //3.如果json字符串数据无效，调用数据库获取，并写入缓存
            //调用dao获取
            //2. 查询所有权限
            List<Module> moduleList = moduleService.findAll();

            //3. 查询当前角色已经拥有的权限
            List<Module> roleModuleList = moduleService.findModuleByRoleId(roleId);

            //4. 遍历所有权限
            for (Module module : moduleList) {
                //4.1 创建map，封装权限信息（map的key是固定的: id、pId、name、checked、open）
                Map<String,Object> map = new HashMap<>();
                map.put("id",module.getId());
                map.put("pId",module.getParentId());
                map.put("name",module.getName());
                map.put("open",true);
                // 设置选中
                if (roleModuleList.contains(module)){
                    map.put("checked",true);
                }
                //4.2 添加到集合
                resultList.add(map);
            }
            //转换为json
            String  jsonData = objectMapper.writeValueAsString(resultList);
            //写入缓存
            jedis.set("modules"+roleId,jsonData);

            result = jsonData;
        }

        //关闭资源
        jedis.close();

        return result;
    }


    /**
     * 6. 角色分配权限（3）role-module.jsp页面点击保存，最终实现角色分配权限
     * @param roleId  角色id
     * @param moduleIds 页面选中的权限id，多个用逗号隔开
     * @return 重定向到角色列表
     */
    @RequestMapping("/updateRoleModule")
    public String updateRoleModule(String roleId,String moduleIds) {
        Jedis jedis = JedisUtils.getJedis();
        jedis.del("modules"+roleId);
        roleService.updateRoleModule(roleId,moduleIds);
        return "redirect:/system/role/list";
    }
}
















